package moldat;

import java.util.ArrayList;
import java.util.List;

/**
 * Diese Klasse stellt einen Container fuer alle Informationen zu einer
 * UniProtID dar. Alle Attribute koennen nur einmal im Konstruktor gesetzt und
 * nachtraeglich nicht mehr veraendert werden.
 *
 * @author Marc Zoeller
 */
public class Protein {

    private String name;
    private String gene;
    private String uniProtID;
    private String arrayExpressUrl;
    private List<String> geneSynonyms;
    private List<String> isoforms;
    private GeneExpression expression;

    /**
     * Erzeugt ein Protein ohne Gen Synonyme.
     *
     * @param name Name des Proteins
     * @param gene Name des Gens
     * @param uniProtID UniProtID
     * @param arrayExpress Link zu ArrayExpress
     * @param isoforms Liste mit allen Isoformen dieses Proteins
     * @param expression Gen-Expression
     */
    public Protein(String name, String gene, String uniProtID, String arrayExpress, List<String> isoforms, GeneExpression expression) {
        this(name, gene, uniProtID, arrayExpress, isoforms, expression, new ArrayList<String>());
    }

    /**
     * Erzeugt ein Protein mit Gen Synonymen.
     *
     * @param name Name des Proteins
     * @param gene Name des Gens
     * @param uniProtID UniProtID
     * @param arrayExpress Link zu ArrayExpress
     * @param isoforms Liste mit allen Isoformen dieses Proteins
     * @param expression Gen-Expression
     * @param geneSynonyms List mit allen Gen Synonymen
     */
    public Protein(String name, String gene, String uniProtID, String arrayExpress, List<String> isoforms, GeneExpression expression, List<String> geneSynonyms) {
        this.name = name;
        this.gene = gene;
        this.uniProtID = uniProtID;
        this.arrayExpressUrl = arrayExpress;
        this.geneSynonyms = geneSynonyms;
        this.isoforms = isoforms;
        this.expression = expression;
    }

    /**
     * Erzeugt ein Protein ohne Gen-Expression.
     *
     * @param name Name des Proteins
     * @param gene Name des Gens
     * @param uniProtID UniProtID
     * @param arrayExpress Link zu ArrayExpress
     * @param isoforms Liste mit allen Isoformen dieses Proteins
     * @param geneSynonyms List mit allen Gen Synonymen
     */
    public Protein(String name, String gene, String uniProtID, String arrayExpress, List<String> isoforms, List<String> geneSynonyms) {
        this(name, gene, uniProtID, arrayExpress, isoforms, null, geneSynonyms);
    }

    /**
     * Liefert die Gen-Expression.
     *
     * @see moldat.GeneExpression
     * @return Gen-Expression
     */
    public GeneExpression getGeneExpression() {
        return expression;
    }

    /**
     * Liefert die UniProtID.
     *
     * @return uniProtID
     */
    public String getUniProtID() {
        return uniProtID;
    }

    /**
     * Liefert den Namen.
     *
     * @return Name
     */
    public String getName() {
        return name;
    }

    /**
     * Liefert den Namen des Gens.
     *
     * @return Name des Gens
     */
    public String getGene() {
        return gene;
    }

    /**
     * Liefert den Link zu ArrayExpress.
     *
     * @return Link zu ArrayExpress
     */
    public String getArrayExpressUrl() {
        return arrayExpressUrl;
    }

    /**
     * Liefert eine Liste mit allen Gen Synonymen.
     *
     * @return Liste mit allen Gen Synonymen
     */
    public List<String> getGeneSynonyms() {
        return geneSynonyms;
    }

    /**
     * Liefert eine Liste mit allen Isoformen.
     *
     * @return Liste mit allen Isoformen
     */
    public List<String> getIsoforms() {
        return isoforms;
    }
}
